﻿using System.Collections.Generic;
using System.ComponentModel;
using ActionLogic;
using BehaviorModel.Block.RandomGenerator;
using Model;
using Model.Block;

namespace BehaviorModel.Block.ServiceChannel
{
    /// <summary>
    /// Describes behavior model of service channel.
    /// </summary>
    public interface IServiceChannel : ISenderBlock, IReceiverBlock, IExecutable, INotifyPropertyChanged

    {
        /// <summary>
        /// Service channel storage.
        /// </summary>
        ServiceChannelStorage Storage { get; }

        /// <summary>
        /// Define whether service channel is busy or is free.
        /// </summary>
        bool IsBusy { get; }

        /// <summary>
        /// Strategy of generating computation.
        /// </summary>
        RandomGeneratorType GeneratorType { get; set; }

        /// <summary>
        /// Generator of serviced time for next request. 
        /// </summary>
        IRandomGenerator ServiceGenerator { get; }

        /// <summary>
        /// Type of choosing discipline.
        /// </summary>
        ChoosingDiscipline Discipline { get; set; }

        /// <summary>
        /// Type of service channel.
        /// </summary>
        ServiceChannelType ChannelType { get; set; }

        /// <summary>
        /// Max length of queue in service channel.
        /// </summary>
        int MaxQueueLength { get; set; }

        /// <summary>
        /// Current length of queue in service channel.
        /// </summary>
        int QueueLength { get; }
    }
}
